/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dto.RegistroSaidaDTO;

/**
 *
 * @author Gabriel
 */
public class RegistroSaidaDAO extends DAO {

    private static final String SELECT_REGISTRO_SAIDA =
                                                "select Id,\n" +
                                                "     Data,\n" +
                                                "     Quantidade,\n" +
                                                "     Destino,\n" +
                                                "     Observacao\n" +
                                                "from Registro_Saida\n" +
                                                "where 1=1";


    public RegistroSaidaDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    private RegistroSaidaDTO getRegistroSaidaResultSet(ResultSet rs) throws SQLException {
        RegistroSaidaDTO registroSaidaDTO = new RegistroSaidaDTO();
        registroSaidaDTO.setData(rs.getDate("Data"));
        registroSaidaDTO.setDestino(rs.getString("Destino"));
        registroSaidaDTO.setId(rs.getInt("Id"));
        registroSaidaDTO.setObservacao(rs.getString("Observacao"));
        registroSaidaDTO.setQuantidade(rs.getInt("Quantidade"));
        return registroSaidaDTO;
    }

    private LinkedList<RegistroSaidaDTO> getRegistrosSaidaResultSet(ResultSet rs) throws SQLException {
        LinkedList<RegistroSaidaDTO> registroSaidaDTOs = new LinkedList<RegistroSaidaDTO>();
        while (rs.next()) {
            registroSaidaDTOs.add(getRegistroSaidaResultSet(rs));
        }
        return registroSaidaDTOs;
    }

    public LinkedList<RegistroSaidaDTO> getTodosRegistrosSaida() throws SQLException {
        sql = SELECT_REGISTRO_SAIDA + ";";
        connector.executeSelectQuery(sql);
        return getRegistrosSaidaResultSet(resultSet);
    }

    public LinkedList<RegistroSaidaDTO> pesquisaRegistroSaida(Integer id,
                                                              Date dataSaida,
                                                              Integer quantidade,
                                                              String destino,
                                                              String observacao) throws SQLException {
        sql = SELECT_REGISTRO_SAIDA;

        if (id != null) {
            sql += "  AND Id = " + id + "\n";
        }

        if (dataSaida != null) {
            sql += "  AND Data = " + dataSaida + "\n";
        }

        if (quantidade != null) {
            sql += "  AND Quantidade = " + quantidade + "\n";
        }

        if (destino != null) {
            sql += "  AND Destino like '%" + destino + "%'\n";
        }

        if (observacao != null) {
            sql += "  AND Observacao like '%" + observacao + "%'\n";
        }

        sql += ";";

        resultSet = connector.executeSelectQuery(sql);

        return getTodosRegistrosSaida();

    }

    public void insereRegistroSaida(RegistroSaidaDTO registroSaidaDTO) throws SQLException {
        sql += "insert into registro_saida(data, quantidade, destino, observacao)" +
               "values("+registroSaidaDTO.getData()+","+registroSaidaDTO.getQuantidade()+","+registroSaidaDTO.getDestino()+","+registroSaidaDTO.getObservacao()+")";
        connector.executeInsertQuery(sql);
    }

    public void atualizaRegistroSaida(RegistroSaidaDTO registroSaidaDTO,
                                      boolean atualizaData,
                                      boolean atualizaQuantidade,
                                      boolean atualizaDestino,
                                      boolean atualizaObservacao) throws SQLException {

        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;

        sql = "UPDATE REGISTRO_SAIDA\n" +
              "SET ";

        if (atualizaData) {
            sql += "Data = " + registroSaidaDTO.getData() + "\n";
            naoPossuiAtualizacaoAinda = false;
        }

        if (atualizaQuantidade) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Quantidade = " + registroSaidaDTO.getQuantidade() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Quantidade = " + registroSaidaDTO.getQuantidade() + "\n";
            }
        }

        if (atualizaDestino) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Destino = " + registroSaidaDTO.getDestino() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Destino = " + registroSaidaDTO.getDestino() + "\n";
            }
        }

        if (atualizaObservacao) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Observacao = " + registroSaidaDTO.getObservacao() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Observacao = " + registroSaidaDTO.getObservacao() + "\n";
            }
        }

        sql += "WHERE Id = " + registroSaidaDTO.getId() + ";";

        connector.executeUpdateQuery(sql);
    }

}
